package com.weboosttools.assist.data

/// Knowledge Point
/// 一个知识点表示一个知识点的名称和描述， 可以由多个知识点共同组成一个知识点集合， 也可以是一个很小的知识点， 例如一个单词从发音到拼写， 或者从含义->发音的能力
/// 一个知识点可以包含一些知识点， 比如单词应该包含发音和拼写, 具体而言， 对于中国人来说， 应该是 发音<->拼写<->含义, 4个能力， 这些能力有关联性， 但是不一定是等价的， 比如会读， 不一定会写， 会写不一定知道其含义，
/// 知道其含义， 反过来能马上读出来， 我们可以在学习的过程中， 通过不断的练习， 来提高这些能力， 从而达到熟练掌握的目的， 同时也在不学习中反过来搜集这些关联性的具体数据（通过机器学习)

open class KnowledgePoint(
    val key: String,
) {
    override fun toString(): String {
        return "KnowledgePoint(key='$key')"
    }
}

open class EnglishLikeWord(
    // 大多数情况下， 只考虑一种拼写， 所以， 就认为不同的拼写是特殊的知识点
    val spelling: String,
    val pronunciation: Array<String>,
    val meaning: Array<String>,
) : KnowledgePoint(
    // key就是拼写本身
    spelling
) {
    // 基本能力点: 发音， 拼写， 含义的相互转换, 重点是下面几种
    // 发音->拼写
    val pronunciationToSpellingAbility = 0.0
    val pronunciationToSpellingAbilityUpdatedAt: Long? = null

    // 拼写->发音
    val spellingToPronunciationAbility = 0.0
    val spellingToPronunciationAbilityUpdatedAt: Long? = null

    // 含义->拼写
    val meaningToSpellingAbility = 0.0
    val meaningToSpellingAbilityUpdatedAt: Long? = null

    // 附带了:
    // 拼写->含义
    val spellingToMeaningAbility = 0.0
    val spellingToMeaningAbilityUpdatedAt: Long? = null

    // 发音->含义
    val pronunciationToMeaningAbility = 0.0
    val pronunciationToMeaningAbilityUpdatedAt: Long? = null

    // 含义->发音
    val meaningToPronunciationAbility = 0.0
    val meaningToPronunciationAbilityUpdatedAt: Long? = null

    // 计算出来的， 认为的能力值应该是一个0-1之间的值， 0表示完全不会， 1表示完全会, 随着时间的推移， 这个值可能会发生变化， 比如减退或者增长
    // 下面算式抽象出来的能力
    val spellingAbility = 0.0
    val spellingAbilityUpdatedAt = 0L
    val pronunciationAbility = 0.0
    val pronunciationAbilityUpdatedAt = 0L
    val meaningAbility = 0.0
    val meaningAbilityUpdatedAt = 0L
}


enum class LearnRecordType {
    /// 新学习
    learn,

    /// 复习
    review,

    /// 测试
    test,
}

/// 某一次的记录， 比如一次听写记录, 一次复习记录
open class LearnRecord(
    val key: String,
    val createdAt: Long,
    val type: LearnRecordType,
    val score: Double = 0.0,
)


/// 英语听写相关的记录的类型
enum class EnglishLikeWordAssociatedRecordType {
    SPELLING_TO_PRONUNCIATION,
    PRONUNCIATION_TO_SPELLING,
    SPELLING_TO_MEANING,
    PRONUNCIATION_TO_MEANING,
    MEANING_TO_SPELLING,
    MEANING_TO_PRONUNCIATION,
}

/// 从pronunciation到spelling的能力记录, 确定性的记录， 包含测试和复习
open class EnglishLikeWordAssociatedRecord(key: String, updatedAt: Long, type: LearnRecordType, double: Double) :
    LearnRecord(key, updatedAt, type, double) {
    val subType: EnglishLikeWordAssociatedRecordType = EnglishLikeWordAssociatedRecordType.SPELLING_TO_PRONUNCIATION
}